package golang

import "gitee.com/allowall-package/goutil/fn"

// 被装饰的接口
type Component interface {
	Calc() int
}

// 某个被装饰的类A
type ComponentA struct{}

// 某个被装饰的类A实现被装饰接口的方法
func (c *ComponentA) Calc() int {
	return 0
}

// ---------------分割线---------------

// 装饰器类A，给被装饰的接口增加num属性
type DecoratorA struct {
	component Component
	num       int
}

// 装饰器类A实现被装饰接口的方法
func (d *DecoratorA) Calc() int {
	return d.component.Calc() + d.num
}

// 用装饰器A进行装饰
func WarpDecoratorA(c Component, n int) Component {
	return &DecoratorA{
		component: c,
		num:       n,
	}
}

// ---------------分割线---------------

// 测试方法
func DecoratorTest() {
	var c Component = &ComponentA{}
	c = WarpDecoratorA(c, 3)

	fn.Dump(fn.FuncInfo(), c.Calc())
}
